#ifndef MQTT_SUBSCRIBER_H_
#define MQTT_SUBSCRIBER_H_

#include <mqtt/async_client.h>

#include <string>

/**
 * MQTT 5.0 订阅者回调类
 * 处理接收到的消息和连接事件
 */
class SubscriberCallback : public virtual mqtt::callback {
 public:
  // 接收消息回调
  void message_arrived(mqtt::const_message_ptr msg) override;

  // 连接丢失回调
  void connection_lost(const std::string& cause) override;

  // 发布完成回调（订阅者无需处理，空实现）
  void delivery_complete(mqtt::delivery_token_ptr token) override;
};

/**
 * MQTT 5.0 订阅者类
 * 负责连接到 broker 并订阅指定主题
 */
class MQTTSubscriber {
 private:
  std::string broker_address_;       // MQTT broker 地址
  std::string client_id_;            // 客户端 ID
  mqtt::async_client client_;        // MQTT 客户端
  SubscriberCallback callback_;      // 回调处理对象
  bool is_connected_;                // 连接状态
  mqtt::connect_options conn_opts_;  // 连接属性

 public:
  //  构造函数
  MQTTSubscriber(const std::string& broker, const std::string& client_id);

  // 析构函数：释放资源并断开连接
  ~MQTTSubscriber();

  // 连接到 MQTT broker
  bool Connect();

  // 断开与 broker 的连接
  void DisConnect();

  // 订阅指定主题
  bool Subscribe(const std::string& topic, int qos = 1);

  // 阻塞等待接收消息
  void WaitForMessages(int duration = 0);

  // 获取当前连接状态
  bool IsConnected() const;
};

#endif  // MQTT_SUBSCRIBER_H